package com.hsgene.order.persistence;

import com.hsgene.common.util.support.LimitHelper;
import com.hsgene.common.util.support.OrderHelper;
import com.hsgene.order.condition.QueryTestingProductOrderCondition;
import com.hsgene.order.condition.SettlementCondition;
import com.hsgene.order.condition.SettlementExportCondition;
import com.hsgene.order.domain.PlatformOrderDto;
import com.hsgene.order.domain.v1.GeneticTestingOrderPackageSign;
import com.hsgene.order.dto.console.*;
import com.hsgene.order.dto.console.detail.OrderBaseInfo;
import com.hsgene.order.dto.console.detail.OrderDoctorInfo;
import com.hsgene.order.dto.v1.OrderSettlementDto;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @desc: 运营后台订单Repository
 * @author: 江承良
 * @date: 2018/9/26 14:17
 */
public interface ConsoleOrderRepository {

    /**
     * @param condition 条件
     * @return int
     * @description 查询订单数量
     * @author maodi
     * @createDate 2018/11/6 10:07
     */
    List<Integer> consoleOrderCount(@Param("condition") QueryTestingProductOrderCondition condition);

    /**
     * 查询订单列表
     *
     * @param condition   检测套餐订单查询条件
     * @param limitHelper 分页条件
     * @param sortType    排序条件
     * @return
     */
    List<ConsoleOrderDto> queryConsoleOrders(@Param("condition") QueryTestingProductOrderCondition condition, @Param
            ("limitHelper") LimitHelper limitHelper, @Param("sortType") String sortType);

    /**
     * 查询超期检测订单数量
     *
     * @param condition 查询条件
     * @return 订单数量
     */
    List<Integer> queryPostponeOrdersCount(@Param("condition") QueryTestingProductOrderCondition condition);

    /**
     * 查询订单超期检测列表
     *
     * @param condition   查询条件
     * @param orderHelper 排序参数
     * @param limitHelper 分页参数
     * @return 订单超期检测列表
     */
    List<PostponeTestingOrderDto> queryPostponeOrders(
            @Param("condition") QueryTestingProductOrderCondition condition,
            @Param("orderHelper") OrderHelper orderHelper,
            @Param("limitHelper") LimitHelper limitHelper);

    /***
     * 查询报告待上传状态的套餐
     * @author jcl
     * @date 2019/1/16 10:55
     * @param orderId 订单id
     * @return
     */
    int testingOrderStatusCount(@Param("orderId") String orderId);

    /***
     * 查询订单是否存在寄送信息
     * @author jcl
     * @date 2019/1/17 10:16
     * @param orderId 订单id
     * @param type 寄送类型
     * @return
     */
    int orderDeliveryCount(@Param("orderId") String orderId, @Param("type") Integer type);

    /**
     * @param signDto 标记信息
     * @param orderId 订单id
     * @return void
     * @description 更新套餐订单标记状态
     * @author maodi
     * @createDate 2018/11/1 16:30
     */
    void updateOrderSign(@Param("signDto") SignDto signDto, @Param("orderId") String orderId);

    /**
     * @param signDto 标记信息
     * @param orderId 订单id
     * @return void
     * @description 更新订单A表标记信息
     * @author maodi
     * @createDate 2019/1/17 9:21
     */
    void updateOrderASign(@Param("signDto") SignDto signDto, @Param("orderId") String orderId);

    /**
     * @param orderId 订单id
     * @return com.hsgene.order.dto.console.SignDto
     * @description 根据订单id获取订单标记信息
     * @author maodi
     * @createDate 2019/1/17 11:05
     */
    SignDto getSignInfo(@Param("orderId") String orderId);

    /**
     * @param lock    锁定状态
     * @param orderId 订单id
     * @return void
     * @description 更新套餐订单锁定状态
     * @author maodi
     * @createDate 2018/11/1 16:47
     */
    void updateOrderLock(@Param("lock") Integer lock, @Param("orderId") String orderId);

    /**
     * @param platformOrder
     * @return void
     * @description 修改平台订单信息
     * @author maodi
     * @createDate 2018/11/5 14:14
     */
    int updatePlatformOrder(@Param("platformOrder") PlatformOrderDto platformOrder);

    /**
     * @param platformOrder
     * @return void
     * @description 修改平台订单表A信息
     * @author maodi
     * @createDate 2018/11/5 14:14
     */
    int updatePlatformOrderAddtionA(@Param("platformOrder") PlatformOrderDto platformOrder);

    /**
     * @param orderId 订单id
     * @return int
     * @description 查询当前订单是否在待地管确认状态 ~ 发票待确认状态之间（包含临界值）
     * @author maodi
     * @createDate 2018/11/5 16:03
     */
    int isStatus(@Param("orderId") String orderId);

    /**
     * @param orderId 订单id
     * @return int
     * @description 查询订单医生是否已经修改
     * @author maodi
     * @createDate 2018/11/6 9:19
     */
    int queryIsChangedDoctor(@Param("orderId") String orderId);

    /**
     * 平台端确认样本弹窗信息获取
     *
     * @param orderId 订单id
     * @return
     * @author jcl
     * @date 2018/11/8 15:41
     */
    List<OrderSampleConfirmDto> sampleConfirmInfo(@Param("orderId") String orderId);

    /***
     * 确认样本
     * @author jcl
     * @date 2018/11/8 17:17
     * @param paramMap 参数
     * @return
     */
    void sampleConfirm(@Param("paramMap") Map<String, Object> paramMap);

    /***
     * 订单的套餐信息
     * @author jcl
     * @date 2018/11/13 10:58
     * @param orderId 订单id
     * @return
     */
    List<OrderSampleConfirmDto> orderPackages(@Param("orderId") String orderId);

    /***
     * 获取机构寄送的物品
     * @author jcl
     * @date 2018/12/21 17:49
     * @param orderId 订单id
     * @param packageId 套餐id
     * @return
     */
    String sendItems(@Param("orderId") String orderId, @Param("packageId") String packageId);

    /***
     * 平台端签收材料
     * @author jcl
     * @date 2018/11/13 11:43
     * @param orderPackageSign 签收信息
     * @return
     */
    void orderPackageSign(GeneticTestingOrderPackageSign orderPackageSign);

    /***
     * 查询机构寄送的最后时间
     * 查询订单套餐对应机构的最后寄送时间
     *
     * @author jcl
     * @date 2018/12/21 17:29
     * @param orderId 订单id
     * @param packageId 套餐id
     * @return 最后寄送时间
     */
    Date orderPackageSendDate(@Param("orderId") String orderId, @Param("packageId") String packageId);

    /***
     * 修改订单套餐状态
     * @author jcl
     * @date 2018/11/13 11:54
     * @param orderId 订单id
     * @param packageId 套餐id
     * @param status 状态
     * @return
     */
    void updateOrderPackageStatus(@Param("orderId") String orderId, @Param("packageId") String packageId, @Param
            ("status") int status);

    /***
     * 订单结算列表数量
     * 所查询的订单状态：13,14,15,21,22,23,24,25,26
     * @author jcl
     * @date 2018/11/13 17:59
     * @param condition
     * @return
     */
    Integer orderSettlementCount(@Param("condition") SettlementCondition condition);

    /***
     * 订单结算列表查询
     * @author jcl
     * @date 2018/11/14 10:50
     * @param condition 查询条件
     * @return
     */
    List<OrderSettlementDto> orderSettlements(@Param("condition") SettlementCondition condition);

    /**
     * 获取导出信息
     *
     * @param ids 导出信息id
     * @return
     */
    List<OrderSettlementDto> getExportInfoByIds(@Param("ids") List<String> ids);

    /**
     * @param orderId 订单id
     * @return com.hsgene.order.dto.console.OrderUpdateDto
     * @description 根据订单id获取订单修改信息
     * @author maodi
     * @createDate 2018/11/27 14:15
     */
    OrderUpdateDto queryOrderUpdate(@Param("orderId") String orderId);

    /**
     * 结算成本更新
     *
     * @param dataList
     */
    Integer updateSettlementInfo(@Param("mapList") List<Map<String, Object>> dataList);


    /***
     * 订单详情
     * @author jcl
     * @date 2018/11/27 15:54
     * @param orderId 订单id
     * @return
     */
    OrderBaseInfo orderDetail(@Param("orderId") String orderId);

    /***
     * 查询变更套餐的操作
     * @author jcl
     * @date 2019/1/17 14:21
     * @param oderId 订单id
     * @param packageId 套餐id
     * @return
     */
    Integer changePackageActionType(@Param("oderId") String oderId, @Param("packageId") String packageId);

    /***
     * 获取订单配送方式
     * @author jcl
     * @date 2018/12/5 16:18
     * @param orderId 订单id
     * @return
     */
    Map<String, Object> orderDeliveryMethod(@Param("orderId") String orderId);

    /***
     * 变更套餐——新增一条订单套餐数据
     * @author jcl
     * @date 2018/12/21 14:26
     * @param orderReplacePackageDto
     * @return
     */
    void insertNewOrderPackage(OrderReplacePackageDto orderReplacePackageDto);

    /***
     * 变更套餐——修改原订单以及原订单套餐信息
     * @author jcl
     * @date 2018/12/21 14:54
     * @param orderReplacePackageDto
     * @return
     */
    void updateOldInfo(OrderReplacePackageDto orderReplacePackageDto);

    /***
     * 变更套餐——删除和此次套餐相同的变更记录
     * @author jcl
     * @date 2019/1/3 11:16
     * @param orderId 订单id
     * @param packageId 变更的套餐id
     * @return
     */
    void deleteOldPackageInterchange(@Param("orderId") String orderId, @Param("packageId") String packageId);

    /***
     * 变更套餐——新增变更套餐信息
     * @author jcl
     * @date 2019/1/3 11:29
     * @param replaceInterchangeDto
     * @return
     */
    void insertOrderInterchange(OrderReplaceInterchangeDto replaceInterchangeDto);

    /**
     * 套餐变更过后更新订单A表
     * @param orderId 订单id
     * @param replenishmentFlag 是否补款
     * @param replenishmentNo 补款编号
     * @param replenishmentCount 补款金额
     */
    void updateOrderA(@Param("orderId") String orderId,@Param("replenishmentFlag") Boolean replenishmentFlag,
                      @Param("replenishmentNo") String replenishmentNo,@Param("replenishmentCount") BigDecimal replenishmentCount);

    /**
     * 导出所有
     *
     * @param exportCondition
     * @return
     */
    List<OrderSettlementDto> exportAll(@Param("condition") SettlementExportCondition exportCondition);

    /***
     *修改订单A表的积分发放状态为待发放积分
     * @author jcl
     * @date 2018/12/26 10:29
     * @param orderId 订单id
     * @return
     */
    void updateOrderAPointSend(String orderId);

    /***
     * 查询订单套餐是否有重复
     * @author jcl
     * @date 2019/1/4 10:18
     * @param orderId 订单id
     * @param packageId 套餐id
     * @return
     */
    int orderPackageCount(@Param("orderId") String orderId, @Param("packageId") String packageId);

    /**
     * 查询接口返回医生信息与原订单信息不符，<br>
     * 批量更新订单医生信息
     *
     * @param info 医生信息
     */
    void updateBatchOrderDoctorInfo(@Param("info") OrderDoctorInfo info);
}
